package com.lzh.hash;

/**
 * @author lzh
 * @create 2022-08-07 17:09
 * <p>
 * 此类供外访问使用
 */
public class HashTableSelf {

    // 定义一个StudentLinkedList的数组，存放每一条链表
    private StudentLinkedList studentLinkedList[];
    // 声明一个数组大小，通过构造器去赋值
    private int size;

    public HashTableSelf(int size) {
        this.size = size;
        this.studentLinkedList = new StudentLinkedList[size];
        // 为每个数组的元素赋值，否则每个数组的每个元素都为null. 会报空指针异常
        for (int i = 0; i < size; i++) {
            studentLinkedList[i] = new StudentLinkedList();
        }
    }

    /**
     * 供外访问的添加方法
     *
     * @param student
     */
    public void add(Student student) {
        // 获取到当前元素应该在哪一条链表
        int hashCode = hashCode(student.getId());
        studentLinkedList[hashCode].add(student);
    }

    /**
     * 根据id删除元素
     *
     * @param id
     */
    public void del(int id) {
        // 获取到当前元素应该在哪一条链表
        int hashCode = hashCode(id);
        studentLinkedList[hashCode].del(id, hashCode);
    }

    public void update(int id, String name) {
        // 获取到当前元素应该在哪一条链表
        int hashCode = hashCode(id);
        studentLinkedList[hashCode].update(id, name, hashCode);
    }

    /**
     * 供外访问的显示链表方法
     */
    public void list() {
        for (int i = 0; i < size; i++) {
            studentLinkedList[i].list(i);
        }
    }

    /**
     * 映射规则
     *
     * @return 返回的值表示在该元素在数组中存放的位置
     */
    public int hashCode(int id) {
        return id % size;
    }

}
